package cn.good.yan.service.t2;

import java.util.concurrent.*;

/**
 * 2. CompletableFuture 定义操作 - 异步任务
 *    异步回掉 ：whenComplete ：上面的线程，执行完，执行这里逻辑        ，有返回值
 *             exceptionally ：上面的线程，执行完，有异常执行这里逻辑  ，有返回值
 *
 * @author shengren.yan
 * @create 2024-03-25
 */
public class CompletableFuture2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        // 有返回参数 - 执行单线程，可传参数,也可以不传（线程池）
        CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "【A】---子线程 - 任务正在执行");
            // 随机生成随机数
            int result = ThreadLocalRandom.current().nextInt(10);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("延迟-----1秒钟后出结果：" + result);
            if (result > 2) {
                // 随机数 大于5，就不会出现异常
                int i = 10 / 0;
            }
            // 当前线程的返回值
            return result;
        }, threadPool).whenComplete((v, e) -> {
            // 上面的线程，执行完，执行这里逻辑
            if (e == null) {
                System.out.println("【whenComplete】-----计算完成，更新系统UpdateValue：" + v);
            }
            System.out.println("【whenComplete】-----有异常，也会执行这里 v：参数：上面线程传递过来的值，e：参数：异常");
        }).exceptionally(e -> {
            // 上面的线程，执行完，有异常执行这里逻辑
            e.printStackTrace();
            System.out.println("【exceptionally】异常情况：" + e.getCause() + "\t" + e.getMessage());
            return null;
        });

        System.out.println(Thread.currentThread().getName() + "线程先去忙其它任务");
        threadPool.shutdown();

    }

    private static void future1() throws InterruptedException, ExecutionException {
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "----come in");
            int result = ThreadLocalRandom.current().nextInt(10);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("-----1秒钟后出结果：" + result);
            return result;
        });
        System.out.println(Thread.currentThread().getName() + "线程先去忙其它任务");
        System.out.println(completableFuture.get());
    }
}
